/*

    gl-oauth  OAuth related projects and samples.
    Copyright (c) 2012-2013 National Marrow Donor Program (NMDP)

    This library is free software; you can redistribute it and/or modify it
    under the terms of the GNU Lesser General Public License as published
    by the Free Software Foundation; either version 3 of the License, or (at
    your option) any later version.

    This library is distributed in the hope that it will be useful, but WITHOUT
    ANY WARRANTY; with out even the implied warranty of MERCHANTABILITY or
    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
    License for more details.

    You should have received a copy of the GNU Lesser General Public License
    along with this library;  if not, write to the Free Software Foundation,
    Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307  USA.

    > http://www.fsf.org/licensing/licenses/lgpl.html
    > http://www.opensource.org/licenses/lgpl-license.php

 */
package org.immunogenomics.gl.oauth.toy.portal;

import java.util.ArrayList;
import java.util.List;

import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import javax.naming.directory.SearchResult;

import org.immunogenomics.gl.oauth.AuthorizationDetails;
import org.immunogenomics.gl.oauth.OAuthProvider;

public class LdapAuthorizationProvider implements OAuthProvider {

    private DirContext dirContext;

    public LdapAuthorizationProvider(DirContext dirContext) {
        this.dirContext = dirContext;
    }

    public AuthorizationDetails getAuthorization(String userid, String realm) {
        AuthorizationDetails details = new AuthorizationDetails();
        try {
            String[] scopes = findScopes("userid=" + userid + ",ou=Users,dc=example,dc=com");
            details.setScopes(scopes);
            if (scopes.length > 0) {
                details.setId(userid);
                details.setRealm(realm);
                details.setDuration(3600);
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return details;
    }

    private String[] findScopes(String uniqueMember) throws NamingException {
        List<String> scopes = new ArrayList<String>();
        BasicAttributes matchingAttrs = new BasicAttributes();
        matchingAttrs.put("uniqueMember", uniqueMember);
        NamingEnumeration<SearchResult> results = dirContext.search("ou=Groups", matchingAttrs);
        while (results.hasMore()) {
            SearchResult sr = results.next();
            Attributes attrs = sr.getAttributes();
            String name = attrs.get("cn").get().toString();
            if (name.endsWith("Scope")) {
                String scope = name.substring(0, name.length() - 5).toLowerCase();
                scopes.add(scope);
            }
        }
        return scopes.toArray(new String[scopes.size()]);
    }

    public void dispose() {
        dirContext = null;
    }

}
